package com.example.demo.leetcode.classics150;

import java.util.*;
import java.util.stream.Collectors;

/**
 * ******************************************************
 *
 * @author liugh9
 * @version 1.0
 * @classname _40同构字符串
 * @description
 * @date 2023/07/21 10:28
 * <p>
 * ******************************************************
 */
public class _40同构字符串 {


    /**
     * 给定两个字符串 s 和 t ，判断它们是否是同构的。
     * <p>
     * 如果 s 中的字符可以按某种映射关系替换得到 t ，那么这两个字符串是同构的。
     * <p>
     * 每个出现的字符都应当映射到另一个字符，同时不改变字符的顺序。
     * 不同字符不能映射到同一个字符上，相同字符只能映射到同一个字符上，字符可以映射到自己本身。
     * <p>
     * <p>
     * <p>
     * 示例 1:
     * <p>
     * 输入：s = "egg", t = "add"
     * 输出：true
     * 示例 2：
     * <p>
     * 输入：s = "foo", t = "bar"
     * 输出：false
     * 示例 3：
     * <p>
     * 输入：s = "paper", t = "title"
     * 输出：true
     * <p>
     * <p>
     * 提示：
     * <p>
     * 1 <= s.length <= 5 * 104
     * t.length == s.length
     * s 和 t 由任意有效的 ASCII 字符组成
     *
     * @param s
     * @param t
     * @return
     */
    public boolean isIsomorphic(String s, String t) {
        Map<Character, Integer> sMap = new HashMap<>();
        Map<Character, Integer> tMap = new HashMap<>();
        for (char c : s.toCharArray()) {
            sMap.put(c, sMap.getOrDefault(c, 0) + 1);
        }
        for (char c : t.toCharArray()) {
            tMap.put(c, tMap.getOrDefault(c, 0) + 1);
        }
        if (sMap.size() != tMap.size()) {
            return false;
        }
        Map<Character, Character> st = new HashMap<>();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            char d = t.charAt(i);
            st.putIfAbsent(c, d);
            Character e = st.getOrDefault(c, d);
            if (!Objects.equals(sMap.get(c), tMap.get(d))) {
                return false;
            } else {
                if (!e.equals(d)) {
                    return false;
                }
            }
        }

        return true;
    }

    public static void main(String[] args) {
        _40同构字符串 s = new _40同构字符串();
        System.out.println(s.isIsomorphic("bbbaaaba", "aaabbbba"));
    }

}
